package com.gosling.cloudspace.tools;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * Sql工具类
 *
 * @author lihonglin
 * @date 2022/5/31 9:25
 */
public class SearchFileTool {
    protected static final Logger logger = LoggerFactory.getLogger(SearchFileTool.class);

    static int countFiles = 0;// 声明统计文件个数的变量
    static int countFolders = 0;// 声明统计文件夹的变量
    static int count = 0;

    static StringBuffer sb = new StringBuffer();

    public static File[] searchFile(File folder, final List<String> keywords) {// 递归查找包含关键字的文件
        File[] subFolders = folder.listFiles(new FileFilter() {// 运用内部匿名类获得文件
            @Override
            public boolean accept(File pathname) {// 实现FileFilter类的accept方法
                if (pathname.isFile())// 如果是文件
                {
                    countFiles++;
                } else
                // 如果是目录
                {
                    countFolders++;
                }
                if (pathname.isFile()) {
                    readFileByLines(pathname, keywords);
                }
                return true;

            }
        });

        List<File> result = new ArrayList<File>();// 声明一个集合
        for (int i = 0; i < subFolders.length; i++) {
            // 循环显示文件夹或文件
            if (subFolders[i].isFile()) {
                // 如果是文件则将文件添加到结果列表中
                result.add(subFolders[i]);
            } else {
                // 如果是文件夹，则递归调用本方法，然后把所有的文件加到结果列表中
                File[] foldResult = searchFile(subFolders[i], keywords);
                // 循环显示文件
                // 文件保存到集合中
                result.addAll(Arrays.asList(foldResult));
            }
        }

        File files[] = new File[result.size()];// 声明文件数组，长度为集合的长度
        result.toArray(files);// 集合数组化
        return files;
    }

    /**
     * 以行为单位读取文件的内容
     */
    public static Boolean readFileByLines(File file, List<String> keywords) {
        BufferedReader reader = null;
        try {
            // System.out.println("以行为单位读取文件内容，一次读一整行：");
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            int line = 1;
            // 一次读入一行，直到读入null为文件结束
            while ((tempString = reader.readLine()) != null) {
                // 显示行号
                int size = keywords.size();
                int countq = 0;
                for (String keyword : keywords) {
                    if (tempString.toLowerCase().contains(keyword.toLowerCase())) {
                        countq++;
                    }
                }
                if (size == countq) {
                    sb.append("文件：").append(file.getAbsolutePath()).append("第").append(line).append("行： ——>[").append(tempString).append("]包含此关键字！");
                    sb.append("\r\n");
                    count++;
                }
                line++;
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOTool.closeQuietly(reader);
        }
        if (count > 0) {
            return true;
        }
        return false;
    }

    // 在文件里写入字符串
    public static void WriteStringToFile(StringBuffer sb) {
        Date date = new Date();
        long time = date.getTime();
        String fileString = "D:/log" + time + ".txt";
        try {
            File file = new File(fileString);
            if (!file.exists()) {
                try {
                    file.createNewFile();
                    System.out.println("创建成功！");
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("创建失败！");
                }
            }
            PrintStream ps = new PrintStream(new FileOutputStream(file));
            // ps.println(sb);
            ps.append(sb);
            //追加
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String fileName = "D:\\项目说明\\31、e签宝对账\\日志\\6月";
        String keyword = "不允许再继续创建";
        List<String> keywords = new ArrayList<>();
        keywords.add(keyword);
        search(fileName, keywords);
    }

    /***
     * 查找文件中的关键字
     * @param fileName
     * @param keywords
     */
    private static void search(String fileName, List<String> keywords) {
        File folder = new File(fileName);// 默认目录
        if (!folder.exists()) {// 如果文件夹不存在
            sb.append("目录不存在：").append(folder.getAbsolutePath());
            sb.append("\r\n");
            return;
        }
        File[] result = searchFile(folder, keywords);// 调用方法获得文件数组
        for (File file : result) {// 循环显示文件
            sb.append(file.getAbsolutePath()).append(" ");
            sb.append("\r\n");
        }
        sb.append("查找了").append(countFolders).append(" 个文件夹，共找到 ").append(+countFiles).append(" 个文件，").append(count).append(" 个符合条件的内容");
        sb.append("\r\n");
        System.out.println(sb);
//        WriteStringToFile(sb);
    }
}
